1 module hip.util.lifetime; 2 3 4 /** 5 * Not yet complete. Need more work. 6 */ 7 mixin template RefCounted() 8 { 9 private int* countPtr; 10 this(this) 11 { 12 if(countPtr != null) 13 *countPtr = *countPtr + 1; 14 } 15 void startRefCount() 16 { 17 import core.stdc.stdlib:malloc; 18 countPtr = malloc(int.sizeof); 19 *countPtr = 1; 20 } 21 ~this() 22 { 23 if(countPtr != null) 24 { 25 *countPtr = *countPtr - 1; 26 if(*countPtr == 0) 27 dispose(); 28 import core.stdc.stdlib: free; 29 free(countPtr); 30 countPtr = null; 31 } 32 } 33 } 34 35 /** 36 * Use this function to export 37 */ 38 enum HipExportedTargets 39 { 40 nativeScript_D = 0, 41 lua, 42 unknown, 43 count 44 } 45 46 47 48 version(HipScriptingAPI) 49 { 50 /** 51 * That may be changed to an associative array in case of slowdowns 52 */ 53 private __gshared Object[][HipExportedTargets.count] _hipExportedSharedUserData; 54 55 56 export extern(C) void hipDestroy(Object reference, int target = HipExportedTargets.nativeScript_D) 57 { 58 for(uint i = 0; i < _hipExportedSharedUserData.length; i++) 59 { 60 if(_hipExportedSharedUserData[target][i] == reference) 61 { 62 _hipExportedSharedUserData[target][i] = null; 63 destroy(reference); 64 } 65 } 66 } 67 68 /** 69 * Guarantees that the reference won't be destroyed after some time by saving the object in the exportedSharedUserData array. 70 */ 71 Object hipSaveRef(Object reference, int target = HipExportedTargets.nativeScript_D) 72 { 73 for(uint i = 0; i < _hipExportedSharedUserData.length; i++) 74 { 75 if(i >= _hipExportedSharedUserData[target].length) 76 break; 77 if(_hipExportedSharedUserData[target][i] is null) 78 { 79 _hipExportedSharedUserData[target][i] = reference; 80 return reference; 81 } 82 } 83 _hipExportedSharedUserData[target] ~= reference; 84 return reference; 85 } 86 87 /** 88 * Destroys every reference inside the target. This function is useful 89 * for managing the destruction for the targets 90 */ 91 void hipDestroyTarget(int target = HipExportedTargets.nativeScript_D) 92 { 93 for(int i = 0; i < _hipExportedSharedUserData[target].length; i++) 94 { 95 if(_hipExportedSharedUserData[target][i] is null) 96 break; 97 hipDestroy(_hipExportedSharedUserData[target][i], target); 98 } 99 } 100 } 101 else 102 { 103 pragma(inline, true) 104 Object hipSaveRef(Object reference, int target = HipExportedTargets.nativeScript_D){return reference;} 105 }